﻿using System;
using System.Diagnostics;
using System.Text;
using Js.ComponentModel;

namespace Js.Service
{
    /// <summary>
    /// Log 버퍼를 나타내는 형식입니다.
    /// </summary>
    public class Log : NotificationObject
    {
        private StringBuilder _logBuilder = new StringBuilder();

        /// <summary>
        /// Js.Service.Log 인스터스를 나타냅니다.
        /// </summary>
        public static Log Instance { get; private set; }

        /// <summary>
        /// Log 메세지를 나타냅니다.
        /// </summary>
        public string Logs
        {
            get { return _logBuilder.ToString(); }
        }

        static Log()
        {
            Instance = new Log();
        }

        private Log()
        {
            // For Singleton
        }

        private void AppendLog(string log)
        {
            _logBuilder.Append(log);
            Debug.Write(log);
            RaisePropertyChanged(() => Logs);
        }

        /// <summary>
        /// Log 버퍼에 메세지를 씁니다.
        /// </summary>
        /// <param name="log">쓸 메세지입니다.</param>
        public static void Write(string log)
        {
            DateTime time = DateTime.Now;
            Instance.AppendLog(String.Format("[{0}.{1}] {2}", time, time.Millisecond, log));
        }

        /// <summary>
        /// Log 버퍼에 메세지를 씁니다.
        /// </summary>
        /// <param name="log">쓸 메세지입니다.</param>
        public static void WriteLine(string log)
        {
            Write((String.Format("{0}\r\n", log)));
        }

        /// <summary>
        /// Log 버퍼에 메세지를 씁니다.
        /// </summary>
        /// <param name="format">문자열 서식입니다.</param>
        /// <param name="parameters">서식을 지정할 개체를 0개 이상 포함하는 개체 배열입니다.</param>
        public static void Write(string format, params object[] parameters)
        {
            DateTime time = DateTime.Now;
            string log = String.Format("[{0}.{1}] {2}", time.ToString(), time.Millisecond, String.Format(format, parameters));
            Instance.AppendLog(log);
        }

        /// <summary>
        /// Log 버퍼에 메세지를 씁니다.
        /// </summary>
        /// <param name="format">문자열 서식입니다.</param>
        /// <param name="parameters">서식을 지정할 개체를 0개 이상 포함하는 개체 배열입니다.</param>
        public static void WriteLine(string format, params object[] parameters)
        {
            Write(String.Format("{0}\r\n", format), parameters);
        }
    }
}